package com.xbh.Book.utils;

import org.apache.commons.beanutils.BeanUtils;

import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;

/**
 * @program: JavaWebExer
 * @description: 封装了BeanUtils的方法数据的封装和抽取BeanUtils的使用
 * BeanUtils工具类可以一次性地把所有请求的参数都注入到JavaBean中。出现这种需求的原因是：
 * 某个业务框中存在很多用户输入的数据内容，此时我们就一条一条的获取并注入JavaBean对象中，这太过于麻烦，于是BeanUtils诞生了。
 * BeanUtils不是jdk的类，是第三方的工具类，所以需要导包
 * @author: 许宝华
 * @create: 2021-04-22 10:04
 */

public class WebUtils {
    /**
     * BeanUtils.populate
     *其需要给定待注入的JavaBean对象，以及对应的properties（键值对参数）。该方法利用反射调用了对应javaBean中的setxxx()方法，
     * 因此一定要保证传递进入的paraName和javaBean中的属性值相同，这样才能成功调用setxxx()方法。
     * 因此，在同时考虑泛型的情况下在该自定义的工具类中要从UserServlet中传递的参数应当为(Map value, T bean)，
     * 而不是(HttpServletRequest req, Object bean)。
     *
     * 这么做的原因：将Map的值注入JavaBean的需求很常见，不只有Web层有这种需求，DAO层，Service层，Web层都可能会有这种需求，
     * 如果这里写成了(HttpServletRequest req, Object bean)，DAO层和Service层就无法使用该方法，
     * 如果写成前者的话，三层都可以使用。使用后者就会使得代码的耦合度过高——优雅。

     * @param value
     * @param bean
     * @return void
     * @author 许宝华
     * @creed: Talk is cheap,show me the code
     * @date 2021/4/22 10:07
     */
    public static <T> T copyParamToBean(Map value, T bean){

        try {
            System.out.println("注入之前"+bean);
            /**
             * 把所有请求的参数都注入到bean对象中,注入核心是通过bean对象的set方法进行注入的
             */
            BeanUtils.populate(bean,value);
            System.out.println("注入之后"+bean);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return bean;
    }
    /**
     * 将字符串类型转换成为int类型
     * @param strInt
     * @param defaultValue 默认值
     * @return void
     * @author 许宝华
     * @creed: Talk is cheap,show me the code
     * @date 2021/4/22 10:07
            */
    public static int parseInt(String strInt,int defaultValue){
        try {

            return Integer.parseInt(strInt);
        } catch (Exception e) {
//            e.printStackTrace();
        }
        return defaultValue;
    }
}
